﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataObjects;
using System.Data.SqlClient;
using InfrastructureSqlServer.Helpers;
using System.Configuration;
using System.Data;

namespace DataAccess
{
    public class UsuarioDAO
    {
        private List<Usuario> CarregarListaUsuario(SqlDataReader dr)
        {
            List<Usuario> liUsuario = new List<Usuario>();

            while (dr.Read())
            {
                Usuario usuario = new Usuario();
                usuario.UsuarioId = int.Parse(dr["UsuarioId"].ToString());
                usuario.Login = dr["Login"].ToString();
                usuario.Senha = dr["Senha"].ToString();
                if (dr["UltimoAcesso"].ToString() != string.Empty)
                    usuario.UltimoAcesso = Convert.ToDateTime(dr["UltimoAcesso"].ToString());
                usuario.Ativo = int.Parse(dr["Ativo"].ToString());
                if (dr["FilialId"].ToString() != string.Empty)
                {
                    usuario.FilialId = int.Parse(dr["FilialId"].ToString());
                    FilialDAO _filialDao = new FilialDAO();
                    usuario.Filial = _filialDao.Consultar(usuario.FilialId)[0];
                }
                if (dr["PessoaId"].ToString() != string.Empty)
                {
                    usuario.PessoaId = int.Parse(dr["PessoaId"].ToString());
                    PessoaDAO _pessoaDAo = new PessoaDAO();
                    usuario.Pessoa = _pessoaDAo.Consultar(usuario.PessoaId)[0];
                }
                liUsuario.Add(usuario);
            }

            return liUsuario;
        }

        public void Inserir(Usuario _usuario)
        {
            SqlParameter[] paramsToSP = new SqlParameter[6];

            paramsToSP[0] = new SqlParameter("@Login", _usuario.Login);
            paramsToSP[1] = new SqlParameter("@Senha", _usuario.Senha);
            paramsToSP[2] = new SqlParameter("@UltimoAcesso", _usuario.UltimoAcesso);
            paramsToSP[3] = new SqlParameter("@Ativo", _usuario.Ativo);
            paramsToSP[4] = new SqlParameter("@FilialId", _usuario.FilialId);
            paramsToSP[5] = new SqlParameter("@PessoaId", _usuario.PessoaId);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_insert_usuario", paramsToSP);

            }
            catch (Exception e)
            {
                throw new Exception("Erro ao inserir usuário, Erro: " + e.Message);
            }

        }

        public bool Alterar(Usuario _usuario)
        {
            SqlParameter[] paramsToSP = new SqlParameter[7];

            paramsToSP[0] = new SqlParameter("@UsuarioId", _usuario.UsuarioId);
            paramsToSP[1] = new SqlParameter("@Login", _usuario.Login);
            paramsToSP[2] = new SqlParameter("@Senha", _usuario.Senha);
            paramsToSP[3] = new SqlParameter("@UltimoAcesso", _usuario.UltimoAcesso);
            paramsToSP[4] = new SqlParameter("@Ativo", _usuario.Ativo);
            paramsToSP[5] = new SqlParameter("@FilialId", _usuario.FilialId);
            paramsToSP[6] = new SqlParameter("@PessoaId", _usuario.PessoaId);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_update_usuario", paramsToSP);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao alterar usuário, Erro: " + e.Message);
            }

        }

        public bool Deletar(int _usuarioId)
        {
            SqlParameter[] paramsToSP = new SqlParameter[1];

            paramsToSP[0] = new SqlParameter("@CaixaOperacaoId", _usuarioId);

            try
            {
                SqlHelper.ExecuteNonQuery(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.StoredProcedure, "stp_delete_usuario", paramsToSP);
                return true;
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao deletar usuário, Erro: " + e.Message);
            }

        }

        public List<Usuario> Consultar(int _usuarioId)
        {
            string sqlQuery = string.Format("SELECT * FROM USUARIO WHERE USUARIOID = {0}", _usuarioId);

            try
            {
                return CarregarListaUsuario(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar usuário, Erro: " + e.Message);
            }

        }

        public List<Usuario> Consultar(string _usuario)
        {
            string sqlQuery = string.Format("SELECT * FROM USUARIO WHERE LOGIN like '%{0}%'", _usuario);

            try
            {
                return CarregarListaUsuario(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar usuário, Erro: " + e.Message);
            }

        }

        public List<Usuario> ValidaLogin(Usuario _usuario)
        {
            string sqlQuery = string.Format("SELECT * FROM USUARIO WHERE LOGIN = '{0}' AND SENHA = '{1}'", _usuario.Login, _usuario.Senha);

            try
            {
                return CarregarListaUsuario(SqlHelper.ExecuteReader(ConfigurationManager.ConnectionStrings["conexao"].ToString(),
                                            CommandType.Text, sqlQuery));
            }
            catch (Exception e)
            {
                throw new Exception("Erro ao consultar usuário, Erro: " + e.Message);
            }

        }

    }//class
}//namespace
